package services;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import domain.Dozent;
import domain.Lehrveranstaltung;
import domain.Modul;
import domain.Raum;
import domain.RaumBelegung;
import domain.Studiengang;
import domain.Universitaet;
import businessLayer.BLDozent;
import businessLayer.BLLehrveranstaltung;
import businessLayer.BLRaum;
import businessLayer.BLStudiengang;
import businessLayer.BLTerminPlanung;


/**
 * Kapselt alle Business-Layer Objekte
 * 
 * @author Patrick Nielinger
 * @version 14.12.14
 */
public class BusinessServicesProvider
{
    private BLDozent bLDozent = null;
    private BLLehrveranstaltung bLLehrveranstaltung = null;
    private BLRaum bLRaum = null;
    private BLStudiengang bLStudiengang = null;
    private BLTerminPlanung bLTerminPlanung = null;
    private Universitaet universitaet = null;

    /**
     * Constructor for objects of class BusinessServicesProvider
     */
    public BusinessServicesProvider(Universitaet universitaet)
    {
       this.universitaet = universitaet;
       bLDozent = new BLDozent(universitaet.getDozenten());
       bLLehrveranstaltung = new BLLehrveranstaltung(universitaet.getLehrveranstaltungen());
       bLRaum = new BLRaum(universitaet.getRaeume());
       bLStudiengang = new BLStudiengang(universitaet.getStudiengaenge());
       bLTerminPlanung = new BLTerminPlanung(universitaet, this);
    }

    public BLDozent getbLDozent() {
        return bLDozent;
    }

    public BLLehrveranstaltung getbLLehrveranstaltung() {
        return bLLehrveranstaltung;
    }

    public BLRaum getbLRaum() {
        return bLRaum;
    }

    public BLStudiengang getbLStudiengang() {
        return bLStudiengang;
    }

    public BLTerminPlanung getbLTerminPlanung(){
    	return bLTerminPlanung;
    }
    
	public List<RaumBelegung> getRaumbelegungByStudiengangNoAndSemester(int studiengangNr, int semester){
    
	Studiengang studiengangObject = universitaet.getStudiengaenge().get(studiengangNr - 1);
	List<Lehrveranstaltung> lvs = new ArrayList<Lehrveranstaltung>();
	List<RaumBelegung> rbs = new ArrayList<RaumBelegung>();
	
	if(studiengangObject != null){
		List<Modul> module = studiengangObject.getModule().stream().filter(x->x.getSemester() == semester).collect(Collectors.toList());
		
		for(Modul modul : module){
			lvs.add(modul.getAssociatedLv());
		}
		
		for(Lehrveranstaltung lv : lvs){
			rbs.addAll(universitaet.getRaumbelegungen().stream().filter(x->x.getLehrveranstaltung().equals(lv)).collect(Collectors.toList()));
		}
		
	}
	
	return rbs;
	
	}
	
	public List<RaumBelegung> getRaumbelegungByStudiengangNameAndSemester(String name, int semester){
	    
		Optional<Studiengang> studiengangObject = universitaet.getStudiengaenge().stream().filter(x->x.getName() == name).findFirst();
		List<Lehrveranstaltung> lvs = new ArrayList<Lehrveranstaltung>();
		List<RaumBelegung> rbs = new ArrayList<RaumBelegung>();
		
		if(studiengangObject != null){
			List<Modul> module = studiengangObject.get().getModule().stream().filter(x->x.getSemester() == semester).collect(Collectors.toList());
			
			for(Modul modul : module){
				lvs.add(modul.getAssociatedLv());
			}
			
			for(Lehrveranstaltung lv : lvs){
				rbs.addAll(universitaet.getRaumbelegungen().stream().filter(x->x.getLehrveranstaltung().equals(lv)).collect(Collectors.toList()));
			}
			
		}
		
		return rbs;
		
		}
	
	public List<RaumBelegung> getRaumbelegungByStudiengangName(String name){
	    
		Optional<Studiengang> studiengangObject = universitaet.getStudiengaenge().stream().filter(x->x.getName() == name).findFirst();
		List<Lehrveranstaltung> lvs = new ArrayList<Lehrveranstaltung>();
		List<RaumBelegung> rbs = new ArrayList<RaumBelegung>();
		
		if(studiengangObject.isPresent()){
			List<Modul> module = studiengangObject.get().getModule().stream().collect(Collectors.toList());
			
			for(Modul modul : module){
				lvs.add(modul.getAssociatedLv());
			}
			
			for(Lehrveranstaltung lv : lvs){
				rbs.addAll(universitaet.getRaumbelegungen().stream().filter(x->x.getLehrveranstaltung().equals(lv)).collect(Collectors.toList()));
			}
			
		}
		
		return rbs;
		
		}
	
	public List<RaumBelegung> getRaumbelegungByRaum(int raumNr){
		Raum raum = universitaet.getRaeume().get(raumNr - 1);
		List<RaumBelegung> rbs = null;
		
		if(raum != null){
			rbs = universitaet.getRaumbelegungen().stream().filter(x->x.getRaum().getName().equals(raum.getName())).collect(Collectors.toList());

		}
		
		return rbs;
	}
	
	public List<RaumBelegung> getRaumbelegungByDozentNo(int dozentenNr){
		Dozent dozent = universitaet.getDozenten().get(dozentenNr - 1);
		List<RaumBelegung> rbs = null;
		
		if(dozent != null){
			rbs = universitaet.getRaumbelegungen().stream().filter(x->x.getDozent().getName().equals(dozent.getName())).collect(Collectors.toList());

		}
		
		return rbs;
	}
	
	public List<RaumBelegung> getRaumbelegungByDozentName(String name){
		Dozent dozent = universitaet.getDozenten().stream().filter(x->x.getName().equals(name)).collect(Collectors.toList()).get(0);
		List<RaumBelegung> rbs = null;
		
		if(dozent != null){
			rbs = universitaet.getRaumbelegungen().stream().filter(x->x.getDozent().getName().equals(dozent.getName())).collect(Collectors.toList());

		}
		
		return rbs;
	}
}
